火星上的平行運算是一門管理多個獨立作業(例如探測車導航、生命訊號遙測與衛星上傳)的藝術,且不會導致系統停頓。在 Go 中,一個 獨立執行的工作 稱為 goroutine。
1. 非確定性原則
最佳做法是永遠假設不同 goroutine 中的操作 可能以任何順序執行。由於 Go 執行環境會在可用的核心之間排程任務,因此若無明確的同步機制,我們無法依賴某台探測車完成掃描後,另一台才開始傳送資料。
go printGopher(c) // 啟動一個新的獨立任務
2. 同步機制
為了管理這些任務,Go 提供了兩個主要工具:
- 互斥鎖: goroutine 可使用一個
mutex來排除彼此在同一時間執行某項操作。 - select 語句: 這類似於 switch 語句,其中每個 case 都包含一個通道接收或傳送操作。
select會等待至某一情況就緒,然後執行該情況。
3. 工作者骨架
長期運行的工作者通常會結合無限迴圈與 select 來同時監控多個通訊通道:
func worker() {
for {
select {
// 在這裡等待通道
}
}
}
for {
select {
// 在這裡等待通道
}
}
}
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>